package com.hon.legionnaire.negocio.dao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import javax.persistence.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.hon.legionnaire.negocio.vo.CompraVO;
import com.hon.legionnaire.negocio.vo.ContaPagarVO;
import com.hon.legionnaire.negocio.vo.ProdutoCompraVO;
import com.hon.legionnaire.negocio.vo.ProdutoVO;

@Service("compraDAO")
public class CompraDAO {

	@PersistenceContext
	private EntityManager entityManager;

	
	public void inserirCompra(CompraVO compraVO) {
		try {
			entityManager.persist(compraVO);
			
			for ( ProdutoCompraVO produtoCompra :  compraVO.getListaProdutoCompraVO() ){
				produtoCompra.setCompraVO(compraVO);
				produtoCompra.getProdutoCompraPK().setCodCompra(compraVO.getCodigo());
				produtoCompra.getProdutoCompraPK().setCodProduto(produtoCompra.getProdutoVO().getCodigo());
				entityManager.persist(produtoCompra);
			}
			
		} catch (Exception e) {
			throw new RuntimeException("Erro ao inserir compra: " + e.getMessage(), e);
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRED)
	public void atualizarCompra(CompraVO compraVO) {
		try {
			entityManager.merge(compraVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao atualizar compra: " + e.getMessage(), e);
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public void removerCompra(CompraVO compraVO) {
		try {
			if (!entityManager.contains(compraVO)) {
				compraVO = entityManager.merge(compraVO);
			}
			entityManager.remove(compraVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao remover compra: " + e.getMessage(), e);
		}
	}

	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public CompraVO obterCompra(CompraVO compraVO) {
		try {
			CompraVO compraAux = new CompraVO();
			compraAux = entityManager.find(CompraVO.class, compraVO.getCodigo());
			/*
			List<ProdutoCompraVO> listaPc = new ArrayList<ProdutoCompraVO>();
			listaPc.addAll((List)compraAux.getListaProdutoCompraVO());
			compraAux.setListaProdutoCompraVO(new ArrayList<ProdutoCompraVO>());
			compraAux.setListaProdutoCompraVO(listaPc);
			*/
			Query query = entityManager.createNamedQuery("loadAllProdutoCompra");
			query.setParameter("codigo", compraAux.getCodigo());
			
//			//List<ProdutoCompraVO> lista = (List<ProdutoCompraVO>) entityManager.createNamedQuery("loadAllProdutoCompra").getResultList();
			List<ProdutoCompraVO> lista = (List<ProdutoCompraVO>) query.getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				compraAux.setListaProdutoCompraVO(lista);
			} else {
				compraAux.setListaProdutoCompraVO(Collections.EMPTY_LIST);
			}
			
			
			return compraAux;
			
		} catch (Exception e) {
			throw new RuntimeException("Erro ao buscar compra: " + e.getMessage(), e);
		}
	}

	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public List<CompraVO> obterListaCompra() {
		try {
			List<CompraVO> lista = (List<CompraVO>) entityManager.createNamedQuery("loadAllCompra").getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				return lista;
			} else {
				return Collections.EMPTY_LIST;
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao carregar todos os compras.", e);
		}
	}
	
	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean validaDuplicado(CompraVO compraVO) {
		Query query = entityManager.createNamedQuery("findDuplicatedCompra");
		query.setParameter("codigo", compraVO.getCodigo());
		query.setParameter("nota", compraVO.getNota());
		query.setParameter("notaSerie", compraVO.getNotaSerie());
		List lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}

	
	
	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

}